home *** CD-ROM | disk | FTP | other *** search
/ Motor Sport Digital Archive Collection 1960s / Motor Sport Digital Archive Collection 1960s.iso / main.swf / scripts / mx / binding / PropertyWatcher.as < prev    next >
Encoding:
Text File  |  2008-05-21  |  5.2 KB  |  188 lines

  1. package mx.binding
  2. {
  3.    import flash.events.Event;
  4.    import flash.events.IEventDispatcher;
  5.    import flash.utils.getQualifiedClassName;
  6.    import mx.core.EventPriority;
  7.    import mx.core.mx_internal;
  8.    import mx.events.PropertyChangeEvent;
  9.    import mx.utils.DescribeTypeCache;
  10.    
  11.    use namespace mx_internal;
  12.    
  13.    public class PropertyWatcher extends Watcher
  14.    {
  15.       mx_internal static const VERSION:String = "2.0.1.0";
  16.       
  17.       private var useRTTI:Boolean;
  18.       
  19.       protected var events:Object;
  20.       
  21.       private var _propertyGetter:Function;
  22.       
  23.       private var _propertyName:String;
  24.       
  25.       private var parentObj:Object;
  26.       
  27.       public function PropertyWatcher(param1:String, param2:Object)
  28.       {
  29.          super();
  30.          _propertyName = param1;
  31.          this.events = param2;
  32.          useRTTI = !param2;
  33.       }
  34.       
  35.       public function set propertyGetter(param1:Function) : void
  36.       {
  37.          _propertyGetter = param1;
  38.       }
  39.       
  40.       private function objectIsEmpty(param1:Object) : Boolean
  41.       {
  42.          var _loc2_:String = null;
  43.          var _loc3_:int = 0;
  44.          var _loc4_:* = param1;
  45.          for(_loc2_ in _loc4_)
  46.          {
  47.             return false;
  48.          }
  49.          return true;
  50.       }
  51.       
  52.       private function addParentEventListeners() : void
  53.       {
  54.          var _loc1_:String = null;
  55.          for(_loc1_ in events)
  56.          {
  57.             if(_loc1_ != "__NoChangeEvent__")
  58.             {
  59.                parentObj.addEventListener(_loc1_,eventHandler,false,EventPriority.BINDING,true);
  60.             }
  61.          }
  62.       }
  63.       
  64.       override public function updateParent(param1:Object) : void
  65.       {
  66.          var _loc2_:String = null;
  67.          var _loc3_:BindabilityInfo = null;
  68.          if(Boolean(parentObj) && parentObj is IEventDispatcher)
  69.          {
  70.             for(_loc2_ in events)
  71.             {
  72.                parentObj.removeEventListener(_loc2_,eventHandler);
  73.             }
  74.          }
  75.          if(param1 is Watcher)
  76.          {
  77.             parentObj = param1.value;
  78.          }
  79.          else
  80.          {
  81.             parentObj = param1;
  82.          }
  83.          if(parentObj)
  84.          {
  85.             if(useRTTI)
  86.             {
  87.                events = {};
  88.                if(parentObj is IEventDispatcher)
  89.                {
  90.                   _loc3_ = DescribeTypeCache.describeType(parentObj).bindabilityInfo;
  91.                   events = _loc3_.getChangeEvents(_propertyName);
  92.                   if(objectIsEmpty(events))
  93.                   {
  94.                      trace("warning: unable to bind to property \'" + _propertyName + "\' on class \'" + getQualifiedClassName(parentObj) + "\'");
  95.                   }
  96.                   else
  97.                   {
  98.                      addParentEventListeners();
  99.                   }
  100.                }
  101.                else
  102.                {
  103.                   trace("warning: unable to bind to property \'" + _propertyName + "\' on class \'" + getQualifiedClassName(parentObj) + "\' (class is not an IEventDispatcher)");
  104.                }
  105.             }
  106.             else if(parentObj is IEventDispatcher)
  107.             {
  108.                addParentEventListeners();
  109.             }
  110.          }
  111.          wrapUpdate(updateProperty);
  112.       }
  113.       
  114.       public function eventHandler(param1:Event) : void
  115.       {
  116.          var _loc2_:Object = null;
  117.          if(param1 is PropertyChangeEvent)
  118.          {
  119.             _loc2_ = PropertyChangeEvent(param1).property;
  120.             if(_loc2_ != _propertyName)
  121.             {
  122.                return;
  123.             }
  124.          }
  125.          wrapUpdate(updateProperty);
  126.          notifyListeners(events[param1.type]);
  127.       }
  128.       
  129.       public function get propertyName() : String
  130.       {
  131.          return _propertyName;
  132.       }
  133.       
  134.       private function updateProperty() : void
  135.       {
  136.          if(parentObj)
  137.          {
  138.             if(_propertyName == "this")
  139.             {
  140.                value = parentObj;
  141.             }
  142.             else if(_propertyGetter != null)
  143.             {
  144.                value = _propertyGetter.apply(parentObj,[_propertyName]);
  145.             }
  146.             else
  147.             {
  148.                value = parentObj[_propertyName];
  149.             }
  150.          }
  151.          else
  152.          {
  153.             value = null;
  154.          }
  155.          updateChildren();
  156.       }
  157.       
  158.       private function eventNamesToString() : String
  159.       {
  160.          var _loc1_:String = null;
  161.          var _loc2_:String = null;
  162.          _loc1_ = " ";
  163.          for(_loc2_ in events)
  164.          {
  165.             _loc1_ += _loc2_ + " ";
  166.          }
  167.          return _loc1_;
  168.       }
  169.       
  170.       override protected function shallowClone() : Watcher
  171.       {
  172.          var _loc1_:PropertyWatcher = null;
  173.          _loc1_ = new PropertyWatcher(_propertyName,events);
  174.          if(_propertyGetter != null)
  175.          {
  176.             _loc1_.propertyGetter = _propertyGetter;
  177.          }
  178.          return _loc1_;
  179.       }
  180.       
  181.       private function traceInfo() : String
  182.       {
  183.          return "Watcher(" + getQualifiedClassName(parentObj) + "." + _propertyName + "): events = [" + eventNamesToString() + (useRTTI ? "] (RTTI)" : "]");
  184.       }
  185.    }
  186. }
  187.  
  188.